using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Boa.HD.AccesoDatos.Entidades;
using Boa.HD.AccesoDatos.Contratos;
using Boa.HD.Negocios.Servicios;
using Boa.HD.Negocios.Excepciones;
using Boa.HD.AccesoDatos.Entidades.DTO;

namespace Boa.HD.Negocios
{
   /// <summary>
   /// Implementacion de la interface IHD_DefinicionProblemaNegociosServicio, los metodos que estan definidos en el contrato IHD_DefinicionProblemaNegociosServicio serán accesibles desde un contexto externo
   /// </summary>	
   public class HD_DefinicionProblemaNegocios : IHD_DefinicionProblemaNegociosServicio
   {
	private IHD_DefinicionProblemaAccesoDatos accesoDatos;
	public HD_DefinicionProblemaNegocios()
	{		
		accesoDatos = DataFactory.Current.GetHD_DefinicionProblemaAccesoDatos();
	}
	
	/// <summary>
    /// Devuelve una lista de HD_DefinicionProblema's de las ocurrencias encontradas a partir del filtro
    /// </summary>    
	public List<HD_DefinicionProblema> BuscarPorFiltro(string filtro)
	{
		var datas = accesoDatos.BuscarPorFiltro(filtro).Where(p=>p.ProblemaPadre!=null).ToList();
        return datas;
    }

	#region operaciones básicas
	
	/// <summary>
    /// Elimina la entidad HD_DefinicionProblema, lanzará una excepcion si la entidad guarda dependencia a otras entidades
    /// </summary>	
	public void Eliminar(HD_DefinicionProblema entidad)
	{
		try
		{
		    accesoDatos.Delete(accesoDatos.GetById(entidad.Id));
	    }
		catch(Exception ex)
		{
		   throw new HD_DefinicionProblemaEliminarExcepcion("HD_DefinicionProblema");
		}
	}
	
	/// <summary>
    /// Devuelve HD_DefinicionProblema, buscada por su Id, si no existe, entonces devuelve null
    /// </summary>	
	public HD_DefinicionProblema ObtenerPorId(object Id)
	{
		return accesoDatos.GetById(Id);
	}

	/// <summary>
    /// Devuelve List<HD_DefinicionProblema>, de todas la entidades de ese tipo
    /// </summary>	
	public List<HD_DefinicionProblema> ObtenerTodas()
	{
		var todos = accesoDatos.GetAll().ToList();
        return todos;
	}

	
	/// <summary>
    /// Guarda HD_DefinicionProblema, previa ejecucion satisfactoria de las reglas de negocio
    /// </summary>	
	public HD_DefinicionProblema Guardar(HD_DefinicionProblema entidad)
	{
		//Agregar aqui las reglas de negocio.......	
		if(entidad==null)
		 throw new HD_DefinicionProblemaRequeridoExcepcion(); 
		
		#region Foreign Keys Values
        if(entidad.ProblemaPadreId_FK > 0 && entidad.ProblemaPadre==null)
            entidad.ProblemaPadre = DataFactory.Current.GetHD_DefinicionProblemaAccesoDatos().GetById(entidad.ProblemaPadreId_FK);
        if(entidad.PrioridadTecnicaId_FK > 0 && entidad.PrioridadTecnica==null)
            entidad.PrioridadTecnica = DataFactory.Current.GetHD_PrioridadTecnicaAccesoDatos().GetById(entidad.PrioridadTecnicaId_FK);
        #endregion


        if (entidad.Id == 0)
        {
            entidad.GuidProblema = System.Guid.NewGuid().ToString();
            entidad.FechaRegistro = DateTime.Now;
            accesoDatos.Insert(entidad);
        }
        else
        {
            entidad.FechaRegistro = DateTime.Now;
            accesoDatos.Update(entidad);
        }
		return entidad;
	}

	#endregion


    public List<HD_DefinicionProblemaLite> ProblemasDefinidosRecursivo()
    {
        return accesoDatos.ProblemasDefinidosSoloHijos().ToList();
    }

    public List<DtoDefProblemaPromedio> ProblemasYPromediosAtencion()
    {
        return accesoDatos.ProblemasYPromediosAtencion().ToList();
    
    }
   }
}


